﻿using IdentityModel.Client;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Maui.Essentials;

namespace BlaMauiApp.Data
{
    /// <summary>
    /// 登录用户管理器
    /// </summary>
    public class LoginUserManager
    {
        /// <summary>
        /// 登录用户信息
        /// </summary>
        public LoginUserInfo UserInfo { get; private set; }

        /// <summary>
        /// 登录用户信息文件名
        /// </summary>
        public const string UserInfoFilename = "userinfo.json";

        private readonly string UserInfoFilePath;

        public LoginUserManager()
        {
            //默认文件目录是C:\Windows\system32，报错
            //System.UnauthorizedAccessException
            //Access to the path 'C:\Windows\system32\userinfo.json' is denied.
            //Environment.CurrentDirectory=C:\Windows\system32
            //AppContext.BaseDirectory是当前运行文件所在目录，安卓没有写权限，报错Read-only file system : '/userinfo.json'
            //FileSystem.AppDataDirectory=/data/user/0/com.companyname.BlaMauiApp/files/userinfo.json
            UserInfoFilePath = Path.Combine(FileSystem.AppDataDirectory, UserInfoFilename);

            Debug.WriteLine($"{DateTimeOffset.Now}, 用户信息文件路径={UserInfoFilePath}");

            if (File.Exists(UserInfoFilePath))
            {
                //如果已经存在登录用户文件，加载登录用户信息
                string userInfoJson = File.ReadAllText(UserInfoFilePath);

                UserInfo = JsonConvert.DeserializeObject<LoginUserInfo>(userInfoJson);

                if (UserInfo.ExpiresIn < DateTimeOffset.Now)
                {
                    //如果登录信息已经过期，清除登录用户信息
                    UserInfo = new LoginUserInfo();

                    //删除登录用户信息文件
                    File.Delete(UserInfoFilePath);
                }
            }
            else
            {
                //如果没有登录用户文件，新建登录用户信息
                UserInfo = new LoginUserInfo();
            }

            //Console.WriteLine输出看不到？
            Debug.WriteLine($"{DateTimeOffset.Now}, 初始化登录用户信息: {UserInfo}");
        }

        /// <summary>
        /// 用户是否已经登录？
        /// </summary>
        public bool IsAuthenticated => !string.IsNullOrWhiteSpace(UserInfo.Username);

        /// <summary>
        /// 登录，提取登录用户信息，并保存到文件
        /// </summary>
        public void Login(TokenResponse tokenResponse, string userInfoJson)
        {
            //提取从Identity Server获取的token结果
            UserInfo.AccessToken = tokenResponse.AccessToken;
            UserInfo.RefreshToken = tokenResponse.RefreshToken;
            UserInfo.ExpiresIn = DateTimeOffset.Now.AddSeconds(tokenResponse.ExpiresIn);

            dynamic userInfo = JsonConvert.DeserializeObject(userInfoJson);

            //从Identity Server获取的用户信息
            UserInfo.UserId = $"{userInfo.sub}";

            //提取name
            UserInfo.Username = $"{userInfo.name}";

            //提取角色
            //id4返回的角色是字符串数组或者字符串
            UserInfo.UserRole = $"{userInfo.role}";

            File.WriteAllText(UserInfoFilePath, JsonConvert.SerializeObject(UserInfo));

            Debug.WriteLine($"{DateTimeOffset.Now}, 用户登录: {UserInfo}");
        }

        /// <summary>
        /// 退出登录
        /// </summary>
        public void Logout()
        {
            string userName = UserInfo.Username;

            //清除登录用户信息
            UserInfo = new LoginUserInfo();

            //删除登录用户信息文件
            File.Delete(UserInfoFilePath);

            Debug.WriteLine($"{DateTimeOffset.Now}, 用户退出登录: {userName}");
        }
    }
}
